package com.videoplat.util;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;

/**
 * 
 * @author wangyan
 *
 */
public final class DateUtils extends GregorianCalendar {

    private static final long serialVersionUID = -7844346312566230961L;

    /**
     * <p>获取当前日期</p>
     *
     * @return 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * <p>获取当前string日期（yyyyMMddHHmmss）</p>
     *
     * @param date data日期
     * @return 当前string日期
     */
    public static String editTimeStamp(Date date) {
        Date dt = new Date();
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        return df.format(dt).toString();
    }

    /**
     * <p>获取当前string日期（yyyy/MM/dd HH:mm:ss）</p>
     *
     * @param date data日期
     * @return 当前string日期
     */
    public static String editTimeStampBySlash(Date date) {
        Date dt = new Date();
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        return df.format(dt).toString();
    }

    /**
     * <p>获取当前string日期（yyyy年MM月dd日）</p>
     *
     * @param date data日期
     * @return 当前string日期
     */
    public static String editDisplayDate(Date date) {
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy年MM月dd日");
        String editDate = myFormat.format(date);
        return editDate;
    }
    
    /**
     * <p>获取当前string日期（yyyyMMdd）</p>
     *
     * @param date data日期
     * @return 当前string日期
     */
    public static String editDisplay2Date(Date date) {
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyyMMdd");
        String editDate = myFormat.format(date);
        return editDate;
    }

    /**
     * <p>获取当前string日期（yyyy-MM-dd）</p>
     *
     * @param date data日期
     * @return 当前string日期
     */
    public static String getStrDate(Date date) {
        SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");
        String editDate = myFormat.format(date);
        return editDate;
    }

    /**
     * <p>Timestamp日期处理</p>
     * @return Timestamp
     */
    public static Timestamp getTimeStampeDate() {
        return new Timestamp(getNowDate().getTime());
    }

    /**
     * <p>字符Timestamp处理</p>
     *
     * @param date 字符Timestamp
     * @return Timestamp
     * @throws Exception Exception异常
     */
    public static Timestamp getTimeStamp(String date) throws Exception {

        try {
            return new Timestamp(new SimpleDateFormat("yyyyMMddHHmmssSSS").parse(date).getTime());
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>字符Timestamp处理</p>
     * @return Timestamp
     */
    public static String getStrNowTimeStampeforFile() {
        return DateUtils.format(getNowDate(), "yyyyMMddHHmmssSSS");
    }

    /**
     * <p>字符Timestamp处理</p>
     * @return Timestamp
     */
    public static String getStrTimeStampeforFile(Date date) {
        return DateUtils.format(date, "yyyyMMddHHmmssSSS");
    }

    /**
     * <p>日期转换处理</p>
     * @param date 字符日期
     * @return 日期
     * @throws Exception Exception异常
     */
    public static Date getDate(String date) throws Exception {
        try {
            date = date.replace("/", "-");
            SimpleDateFormat haifnformat = new SimpleDateFormat("yyyy-MM-dd");
            haifnformat.setLenient(false);
            return haifnformat.parse(date);
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>日期转换处理</p>
     *
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 日期
     * @throws Exception Exception异常
     */
    public static Date getDate(String year, String month, String day) throws Exception {

        String date = new StringBuilder().append(year).append("-").append(month).append("-").append(day).toString();

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return simpleDateFormat.parse(date);
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>日期转换处理</p>
     * @param date 字符日期（yyyy-MM-dd）
     * @return 日期
     * @throws Exception Exception异常
     */
    public static Date getDateYYYYMMDD(String date) throws Exception {

        date = date.replace("/", "-");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return simpleDateFormat.parse(date);
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>日期转换处理</p>
     * @param date 字符日期（yyyyMM）
     * @return 日期
     * @throws Exception Exception异常
     */
    public static Date getDateYYYYMM(String date) throws Exception {

        date = date.replace("/", StringUtils.EMPTY);
        date = date.replace("-", StringUtils.EMPTY);
        final int dayEndLength = 6;
        date = date.substring(0, dayEndLength);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM");
        try {
            return simpleDateFormat.parse(date);
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>日期转换处理</p>
     * @param date 字符日期
     * @return 日期
     * @throws Exception Exception异常
     */
    public static Date getTimeStampDate(String date) throws Exception {
        try {
            return new Timestamp(DateFormat.getDateInstance().parse(date).getTime());
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * <p>获取去年同一天</p>
     *
     * @param date 日期
     * @return 去年这一天
     */
    public static Date getPreviousSameDay(Date date) {

        return org.apache.commons.lang.time.DateUtils.addYears(date, -1);
    }

    /**
     * <p>去年同一周</p>
     * @param date 日期
     * @return 去年同一周
     */
    public final Date getPreviousSameDayWeek(Date date) {

        Calendar now = Calendar.getInstance();
        now.setTime(date);

        Date previousDate = org.apache.commons.lang.time.DateUtils.addYears(date, -1);
        Calendar previous = Calendar.getInstance();
        previous.setTime(previousDate);

        while (now.get(Calendar.DAY_OF_WEEK) != previous.get(Calendar.DAY_OF_WEEK)) {
            previous.add(Calendar.DATE, 1);
        }

        return previous.getTime();
    }

    /**
     * <p>日期格式转换</p>
     *
     * @param date 日期
     * @param pattern 格式
     * @return 日期
     */
    public static final String format(Date date, String pattern) {
        if (date == null || pattern == null) {
            return "";
        }
        return DateFormatUtils.format(date, pattern);
    }

    /**
     * <p>日期标准格式转换</p>
     *
     * @param date 日期
     * @return 标准格式
     */
    public static final String formatYYYYMMDD(Date date) {

        return DateFormatUtils.format(date, "yyyy-MM-dd");
    }

    /**
     * <p>获取当前日期</p>
     *
     * @return 当前日期
     */
    public static java.sql.Date getNowSQLDate() {
        return new java.sql.Date(getNowDate().getTime());
    }

    /**
     * sql日期转化
     *
     * @param date date
     * @return SQL Date
     * @throws Exception Exception异常
     */
    public static java.sql.Date getSQLDate(Date date) throws Exception {

        return new java.sql.Date(date.getTime());
    }

    /**
     * sql String to Date转换
     * @param date date
     * @return SQL Date
     * @throws Exception Exception异常
     */
    public static java.sql.Date getSQLDate(String date) throws Exception {

        date = date.replace("/", "-");
        SimpleDateFormat haifnformat = new SimpleDateFormat("yyyy-MM-dd");
        haifnformat.setLenient(false);

        try {
            return getSQLDate(haifnformat.parse(date));
        } catch (ParseException e) {
            throw new Exception(e);
        }
    }

    /**
     * sql String to Date转换
     * @param year 年
     * @param month 月
     * @param day 日
     * @return SQL Date
     * @throws Exception Exception异常
     */
    public static java.sql.Date getSQLDate(String year, String month, String day) throws Exception {

        SimpleDateFormat sDateFmt = new SimpleDateFormat("yyyy/MM/dd");
        sDateFmt.setLenient(false);

        String sb = new StringBuilder().append(year).append("/").append(month).append("/").append(day).toString();

        return getSQLDate(sb);
    }

    /**
     * 获取期间月数
     *
     * @param start 开始月
     * @param end 结束月
     * @return 月数
     */
    public static int getMonth(Date start, Date end) {
        if (start.after(end)) {
            Date t = start;
            start = end;
            end = t;
        }
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(start);
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(end);
        Calendar temp = Calendar.getInstance();
        temp.setTime(end);
        temp.add(Calendar.DATE, 1);
        int year = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
        int month = endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH);

        final int monthrange = 12;
        if ((startCalendar.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) == 1)) {
            return year * monthrange + month + 1;
        } else if ((startCalendar.get(Calendar.DATE) != 1) && (temp.get(Calendar.DATE) == 1)) {
            return year * monthrange + month;
        } else if ((startCalendar.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) != 1)) {
            return year * monthrange + month;
        } else {
            return (year * monthrange + month - 1) < 0 ? 0 : (year * monthrange + month);
        }
    }

    /**
     * 获取期间月数
     *
     * @param start开始月
     * @param end 结束月
     * @return 月数
     */
    public static int getYear(Date start, Date end) {
        if (start.after(end)) {
            Date t = start;
            start = end;
            end = t;
        }
        Calendar startCalendar = Calendar.getInstance();
        startCalendar.setTime(start);
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(end);
        Calendar temp = Calendar.getInstance();
        temp.setTime(end);
        temp.add(Calendar.DATE, 1);
        int year = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
        if ((startCalendar.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) == 1)) {
            return year + 1;
        } else if ((startCalendar.get(Calendar.DATE) != 1) && (temp.get(Calendar.DATE) == 1)) {
            return year;
        } else if ((startCalendar.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) != 1)) {
            return year;
        } else {
            return (year - 1) < 0 ? 0 : (year);
        }
    }

    /**
     * 获取年
     *
     * @param date 日期
     * @return 年
     */
    public static String getStrDateYYYY(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return String.valueOf(cal.get(YEAR));
    }

    /**
     * 获取年
     *
     * @param date 日期
     * @return 年
     */
    public static int getDateYYYY(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(YEAR);
    }

    /**
     * 获取年
     *
     * @return 年
     */
    public static int getNowDateYYYY() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return cal.get(YEAR);
    }

    /**
     * 获取年
     *
     * @return 年
     */
    public static String getStrDateYYYY() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return String.valueOf(cal.get(YEAR));
    }

    /**
     * 获取月
     *
     * @param date 日期
     * @return 月
     */
    public static String getStrDateMM(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return String.valueOf(cal.get(MONTH) + 1);
    }

    /**
     * 获取月
     *
     * @param date 日期
     * @return 月
     */
    public static int getDateMM(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(MONTH) + 1;
    }

    /**
     * 获取月
     *
     * @return 月
     */
    public static String getStrNowDateMM() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return String.valueOf(cal.get(MONTH) + 1);
    }

    /**
     * 获取月
     *
     * @return 月
     */
    public static int getNowDateMM() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return cal.get(MONTH) + 1;
    }

    /**
     * 获取日
     *
     * @param date 日期
     * @return 日
     */
    public static int getDateDD(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return cal.get(DATE);
    }

    /**
     * 获取日
     *
     * @param date 日期
     * @return 日
     */
    public static String getStrDateDD(Date date) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        return String.valueOf(cal.get(DATE));
    }

    /**
     * 获取日
     *
     * @return 日
     */
    public static int getNowDateDD() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return cal.get(DATE) + 1;
    }

    /**
     * 获取日
     *
     * @return 日
     */
    public static String getStrNowDateDD() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(getNowDate());
        return String.valueOf(cal.get(DATE) + 1);
    }

    /**
     * 字符年月（yyyyMM）
     *
     * @param year 年
     * @param month 月
     * @return 年月字符列（yyyyMM）
     * @throws Exception Exception异常
     */
    public static int getIntYYYYMM(String year, String month) throws Exception {

        return Integer.parseInt(getStrYYYMM(year, month));
    }

    /**
     * 字符年月（yyyyMM）
     *
     * @param year 年
     * @param month 月
     * @return 字符年月（yyyyMM）
     * @throws Exception Exception异常
     */
    public static String getStrYYYMM(String year, String month) throws Exception {

        Date date = getDate(year, month, "01");
        return getStrYYYMM(date);
    }

    /**
     * 字符年月（yyyyMM）
     *
     * @param date 日期
     * @return 字符年月（yyyyMM）
     * @throws Exception Exception异常
     */
    public static String getStrYYYMM(Date date) throws Exception {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMM");
        return dateFormat.format(date);
    }

    /**
     * 字符年月（yyyyMM）
     *
     * @param date 日期
     * @return 字符年月（yyyyMM）
     * @throws Exception Exception异常
     */
    public static int getIntYYYMM(Date date) throws Exception {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMM");
        return Integer.valueOf(dateFormat.format(date));
    }

    /**
     * 字符年月（yyyy-MM-dd）
     *
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 字符年月（yyyy-MM-dd）
     * @throws Exception Exception异常
     */
    public static String getStrDateHf(String year, String month, String day) throws Exception {

        Date date = getDate(year, month, day);

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return dateFormat.format(date);
    }

    /**
     * 字符年月（yyyy-MM-dd）
     *
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 字符年月（yyyy-MM-dd）
     * @throws Exception Exception异常
     */
    public static String getStrDate(String year, String month, String day) throws Exception {

        Date date = getDate(year, month, day);

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        return dateFormat.format(date);
    }

    /**
     * 
     */
    public static String getWeek() {
        Calendar cal = Calendar.getInstance();
        switch (cal.get(Calendar.DAY_OF_WEEK)) {
        case 1:
            return "星期天";
        case 2:
            return "星期一";
        case 3:
            return "星期二";
        case 4:
            return "星期三";
        case 5:
            return "星期四";
        case 6:
            return "星期五";
        case 7:
            return "星期六";
        }
        return null;
    }

}